import 'todo.dart';
import 'newa.dart';
import 'func.dart';
import 'class.dart';

@Todo('me','yuncong')
String say(String from,String msg,[String device]) {
  var result = '$from says $msg';
  if (device != null) {
    result = '$result with a $device';
  }
  return result;
}

void main() {
  // var name = '李学坪';
  // dynamic name1 = '张三';
  // String name2 = '李四';
  // print(name+name1+name2);


  // int intDefaultValue;
  // assert(intDefaultValue == null);
  // print(intDefaultValue);

  // final name3 = 'gogogo';
  // const name4 = 'gogogo4';

  // print(name3+name4);

  // const speed = 100;
  // const double distance = 2.5 * speed;
  // print(distance);

  // var varList = const [];
  // varList = ['haha'];
  // print(varList);
  // print(varList.length);
  // print(varList.indexOf('haha'));
  // // 这些是常量字符串
  // const aConstNum = 0;
  // const aConstBool = true;
  // const aConstString = 'a constant string';

  // // 这些不是常量字符串

  // var aNum = 0;
  // var aBool = true;
  // var aString = 'a string';
  // const aConstList = const [1, 2, 3];

  // const validConstString = '$aConstNum $aConstBool $aConstString';
  // print(validConstString);

  // int intNum1 = 10 ;
  // print(intNum1);
  // int intNum2 = 0xDEADBEEF ;
  // print(intNum2);

  // String str1 = '李学坪';
  // print(str1);
  // //单引号里面嵌套单引号，必须在前面加反斜杠
  // String str3 = '双引号里面有单引号it\'s，必须在前面加反斜杠.';
  // //双引号里面嵌套单引号（正常使用）
  // String str4 = "双引号里面有单引号it's.";
  // //单引号里面嵌套双引号（正常使用）
  // String str5 = '单引号里面有双引号，编程开发初学必备语句"hello world"';
  // //双引号里面嵌套双引号，必须在前面加反斜杠
  // String str6 = "双引号里面有双引号，编程开发初学必备语句\"hello world\"";
  // print(str3);
  // print(str6);

  // String connectionStr1 =  '字符串连接'
  //   '甚至可以在'
  //   '换行的时候进行。';
  // print(connectionStr1);
  // print(r"换行符：\n"); //这个结果是 换行符：\n
  // print("换行符：\\n"); //这个结果是 换行符：\n
  // print("换行符：\n");  //这个结果是 换行符：

  // String re1 = '字符串连接';
  // print('$re1'
  // '甚至可以在换行的时候进行。' == '字符串连接'
  // '甚至可以在黄河的时候尽心过');

  // String re2 = 'Android Studio';
  // print('you know'+ 
  // '${re2.toUpperCase()}'
  // +'最新的版本号是多少吗?');

  // var fullName = '';
  // assert(fullName == '1');

  // var unicorn;
  // assert(unicorn != null);

  // List list  = [9,8,3,2,6,1,2,3,3,4,5,5];
  // list.sort();
  // print(list);

  // List<String> name = ["1","asdasd","123","ssssssss"];
  // name.sort((a,b) => a.length.compareTo(b.length));
  // print(name);
  // print(name.every((String)));

  // Map com1 = new Map();
  // com1["first"] = "阿里巴巴";

  // print(com1);

  // Map companys = {'first': '阿里巴巴', 'second': '腾讯', 'fifth': '百度'};
  // print(companys);//打印结果 {first: 阿里巴巴, second: 腾讯, fifth: 百度}
  // companys[4] = 'qwdqwd';
  // print(companys);

  // final fruit = const {2:'apple',19:'orange','name':'lxp'};
  // fruit['one'] = '';
  // print(fruit);

  // var clapping = '\u{1f44f}';
  // print(clapping);
  // print(clapping.codeUnits);
  // print(clapping.runes.toList());

  // //这里使用String.fromCharCodes方法显示字符图形
  // //String的详细api后面会具体讲解。
  // Runes input = new Runes(
  //     '\u2665  \u{1f605}  \u{1f60e}  \u{1f47b}  \u{1f596}  \u{1f44d}');
  // print(new String.fromCharCodes(input));

  // int a = 10;
  // a << 2;
  // print(a);

  // print(8 ^ 10);

  // print(1<2 ?? 100);

  // @Todo('seth','make this do something')
  // void doSomething() {
  //   print('do somethong');
  // }

  // doSomething();

  // print(say("one", "two"));
  // print(say("lxp","lfl","ipad"));



  // var list = [1,2,3,4,5,6,67];
  // list.forEach(printElement);

  // var speak = (msg) => print('!!!msg is $msg !!!');

  // list.forEach(speak);

  // list.forEach((item) {
  //   print('${list.indexOf(item)}: $item');
  // });

  // list.forEach(
  //   (item) => print('${list.indexOf(item)}: $item')
  // );

  // var add2 = makeAdder(2);
  // var add4 = makeAdder(4);

  // assert(add2(3) == 5);
  // print('ok2');
  // assert(add4(4) == 7);
  // print(add4(4));

  // String Whatthis(String name) => name ?? "Guest";

  // print(Whatthis(null));
  // print(Whatthis("kind"));

  // var a = Aj("lixueping","yourself");
  // a.getself()
  // ..name = 'ok'
  // ..getself()
  // ..speak()
  // ..who = 'the other'
  // ..speak();

  // List abc = [1,2,3,4];
  // abc.where((c) => c < 3)
  // .forEach((c) => print('this num is $c'));

  // List person = [
  //   A(1),
  //   A(2),
  //   A(3),
  //   A(4),
  //   A(5)
  // ];

  // person
  //   .where((test) => test.yearsExperience >= 3)
  //   .forEach((f) => f.interview());

  // assert(false);
  // try {
  //   print('123');
  // } on OutOfMemoryError {
  //   print('outofmemory');
  // } on Exception catch(e){
  //   print('Unknown exception: $e');
  // } catch(e,s) { // 第一个是抛出的异常，第二个是堆栈跟踪(StackTrace对象)。
  //   print('something unknown: $e');
  //   print('Stack trace: \n $s');
  //   rethrow; // 要在捕获中处理异常，同时允许其继续传播，请使用rethrow关键字。
  // } finally { // 要确保在抛出异常时运行某些业务代码，请使用finally子句。如果没有catch子句匹配异常，则在finally子句运行后传播异常:
  //   clear();
  // }


//   var a = const Todo("1", "1");
//   var b = const Todo("1", "2");

//   try {
//     print('haha ${a.runtimeType}');
//     assert(identical(a, b)); // They are the same instance!
//   } on Exception catch(e) {
//     print(e);
//   }

//   var point = Point();
//   point.x = 4;
//   assert(point.x == 4);
//   assert(point.y == null);

  // var emp = Employee.fromJson({});

  // if (emp is Person) {
  //   emp.firstname = "Bob1";
  // } 
  // (emp as Person).firstname = "Bob2";

  // var a = Point(100,200);
  // a.show();
  // var b = Point(1002,3213);
  // print(a.distanceTo(b));

  // var rect = Rectangle(3,4,20,15);
  // print(rect.left);
  // rect.right = 12;
  // print(rect.left);

  // print(greetBob(Person1('Kathy')));
  // print(greetBob(Impostor()));

  var names = List<String>();
  names.addAll(['iterable','Seth','Xise','Lars']);
  // names.add(42); // Error

  // 使用集合字面量
  var names1 = <String>['Seth', 'Kathy', 'Lars'];
  var pages = <String, String>{
    'index.html': 'Homepage',
    'robots.txt': 'Hints for web robots',
    'humans.txt': 'We are people, not machines'
  };
  names.where((test) => test.length == 4).forEach((f) => print(f));

  // 构造函数的参数化类型
  // 要在使用构造函数时指定一个或多个类型，请将类型放在类名后面的尖括号(<…>)中。例如:

  var names123 = List<String>();
  names.addAll(['Seth', 'Kathy', 'Lars']);
  var nameSet = Set<String>.from(names);
}


